﻿#pragma once

#include <vulkan/vulkan.hpp>

#include "Render/VulkanMemory/FixedUniformBuffer.h"

//材质引擎参数
//不能随意修改，因为这个结构体对应着着色器代码
//uniform SceneBufferObject
// {
//     vec4 Floats[];
// } SceneBuffer;

struct SSceneParameters
{
    float ProjectViewMatrix[16];   //在着色器中，对应 Floats[0]~Floats[3]
    float CameraNearPlane;        //在着色器中，对应 Floats[4].x
    float CameraFarPlane;         //在着色器中，对应 Floats[4].y
    float Padding[2];             //在着色器中，对应 Floats[4].z~Floats[4].w

    float ProjectMatrix[16];      //在着色器中，对应 Floats[5]~Floats[8]
    float ViewMatrix[16];         //在着色器中，对应 Floats[9]~Floats[12]
    float CameraPosition[3];      //在着色器中，对应 Floats[13].xyz
    float Padding2;               //在着色器中，对应 Floats[13].w

    float CameraForwardDirection[3];  //在着色器中，对应 Floats[14].xyz
    float Padding3;                   //在着色器中，对应 Floats[14].w
    float CameraRightDirection[3];    //在着色器中，对应 Floats[15].xyz
    float Padding4;                   //在着色器中，对应 Floats[15].w
    float CameraUpDirection[3];       //在着色器中，对应 Floats[16].xyz
    float Padding5;                   //在着色器中，对应 Floats[16].w

    bool IsSphereIntersectWithFrustum(const SVec3& SphereCenter,float SphereRadius) const;
};

class CSceneParameterBuffer
{
public:

    CSceneParameterBuffer();

    //刷新缓冲区内容
    void UpdateBuffer(const SSceneParameters& InParameters);

    void PrepareSelfRecord();

    void UpdateDescriptorSet();

    vk::DescriptorSet GetDescriptorSet() const { return DescriptorSet; }
protected:

    TVulkanUniformBuffer<SSceneParameters> Buffer;

    //描述集,只包含一个缓冲区
    vk::DescriptorSet DescriptorSet;
};